package com.zw.mes.module.materialRequisition.service;

import com.zw.mes.common.JsonResult;
import com.zw.mes.entity.sys.User;
import com.zw.mes.module.materialRequisition.mapper.MatReqMapper;
import com.zw.mes.module.materialRequisition.model.CollMatDetail;
import com.zw.mes.module.materialRequisition.model.VerifySheet;
import com.zw.mes.module.prodtaskmanager.model.SysDeptModel;
import com.zw.mes.module.system.service.LogService;
import com.zw.mes.module.verify.model.OrgModel;
import com.zw.mes.module.verify.model.VerifyInfoModel;
import com.zw.mes.module.verify.model.VerifyProcess;
import com.zw.mes.util.ShiroUtils;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @className: MatReqService
 * @description: 领料申请管理业务逻辑层
 * @author： 徐一贺 18341916590
 * @date： 2021/4/12 15:02
 * @office: 智能控制设计科
 * @research institute： 智能控制设计所
 * @department： 机械设计院
 * @company: 辽宁忠旺机械设备制造有限公司
 * @group： 忠旺集团
 * @version: 1.0
 */
@Log4j2
@Service
public class MatReqService {

    @Autowired
    private MatReqMapper mapper;
    @Autowired
    private LogService logService;

    /**
     * @methodName: getDeptModelByPrimary
     * @description: 根据主键获取部门表实体类
     * @param: deptId
     * @return： com.zw.mes.module.prodtaskmanager.model.SysDeptModel
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/12 15:10
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public SysDeptModel getDeptModelByPrimary(Integer deptId) {
        return mapper.getDeptModelByPrimary(deptId);
    }

    /**
     * @methodName: save
     * @description: 保存车间自用原材料领料申请单
     * @param: sheetId
     * @param: collMatDetailJson
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/12 16:58
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult save(Integer sheetId, List<CollMatDetail> collMatDetailList, List<Integer> delCmtdIdList) {
        JsonResult jsonResult = new JsonResult();
        try {
            Date currentDate = new Date();
            User currentUser = ShiroUtils.getUser();
            //插入
            if (sheetId == null) {
                if (collMatDetailList.size() > 0) {
                    VerifySheet verifySheet = new VerifySheet();
                    verifySheet.setAppType(1);
                    verifySheet.setMakUid(currentUser.getId());
                    verifySheet.setMakDeptId(currentUser.getDeptId());
                    verifySheet.setMakCreateTime(currentDate);
                    verifySheet.setAppStatus(1);
                    verifySheet.setDelFlag(0);
                    verifySheet.setOrderNo(getMaterialRequisition());
                    mapper.insertVerifySheet(verifySheet);
                    for (CollMatDetail collMatDetail : collMatDetailList) {
                        collMatDetail.setCmtdSheetId(verifySheet.getId());
                        mapper.insertCollMatDetail(collMatDetail);
                        if (collMatDetail.getCmtdRemark() == null) {
                            collMatDetail.setCmtdRemark("");
                        }
                        logService.saveLog("车间自用原材料领料申请单-保存", "新增了流水号为【" + verifySheet.getOrderNo() + "】的申请单,内容为物料用途【" + collMatDetail.getCmtdUse() + "】,物料名称【" + collMatDetail.getCmtdMatName() + "】,材质【" + collMatDetail.getCmtdTexture() + "】，规格【" + collMatDetail.getCmtdSpec() + "】,数量【" + collMatDetail.getCmtdNum() + "】，备注【" + collMatDetail.getCmtdRemark() + "】。");
                    }

                }
            }
            //更新
            else {
                VerifySheet verifySheet = mapper.getVerifySheetByPrimaryKey(sheetId);
                verifySheet.setMakEditTime(currentDate);
                verifySheet.setMakEditUid(currentUser.getId());
                mapper.updateVerifySheetByPrimaryKey(verifySheet);
                for (CollMatDetail collMatDetail : collMatDetailList) {
                    if (collMatDetail.getCmtdId() == null) {
                        collMatDetail.setCmtdSheetId(verifySheet.getId());
                        mapper.insertCollMatDetail(collMatDetail);
                        if (collMatDetail.getCmtdRemark() == null) {
                            collMatDetail.setCmtdRemark("");
                        }
                        logService.saveLog("车间自用原材料领料申请单-保存", "新增了流水号为【" + verifySheet.getOrderNo() + "】的申请单,内容为物料用途【" + collMatDetail.getCmtdUse() + "】,物料名称【" + collMatDetail.getCmtdMatName() + "】,材质【" + collMatDetail.getCmtdTexture() + "】，规格【" + collMatDetail.getCmtdSpec() + "】,数量【" + collMatDetail.getCmtdNum() + "】，备注【" + collMatDetail.getCmtdRemark() + "】。");
                    } else {
                        CollMatDetail dataBaseCollMatDetail = mapper.getCollMatDetailByPrimaryKey(collMatDetail.getCmtdId());
                        String logContent = "";
                        if (!dataBaseCollMatDetail.getCmtdUse().equals(collMatDetail.getCmtdUse())) {
                            logContent += "物料用途【" + dataBaseCollMatDetail.getCmtdUse() + "】➨【" + collMatDetail.getCmtdUse() + "】,";
                        }
                        if (!dataBaseCollMatDetail.getCmtdMatName().equals(collMatDetail.getCmtdMatName())) {
                            logContent += "物料名称【" + dataBaseCollMatDetail.getCmtdMatName() + "】➨【" + collMatDetail.getCmtdMatName() + "】,";
                        }
                        if (!dataBaseCollMatDetail.getCmtdTexture().equals(collMatDetail.getCmtdTexture())) {
                            logContent += "材质【" + dataBaseCollMatDetail.getCmtdTexture() + "】➨【" + collMatDetail.getCmtdTexture() + "】,";
                        }
                        if (!dataBaseCollMatDetail.getCmtdSpec().equals(collMatDetail.getCmtdSpec())) {
                            logContent += "规格【" + dataBaseCollMatDetail.getCmtdSpec() + "】➨【" + collMatDetail.getCmtdSpec() + "】,";
                        }
                        if (dataBaseCollMatDetail.getCmtdNum().compareTo(collMatDetail.getCmtdNum()) != 0) {
                            logContent += "数量【" + dataBaseCollMatDetail.getCmtdNum() + "】➨【" + collMatDetail.getCmtdNum() + "】,";
                        }
                        if (dataBaseCollMatDetail.getCmtdRemark() == null) {
                            dataBaseCollMatDetail.setCmtdRemark("");
                        }
                        if (collMatDetail.getCmtdRemark() == null) {
                            collMatDetail.setCmtdRemark("");
                        }
                        if (!dataBaseCollMatDetail.getCmtdRemark().equals(collMatDetail.getCmtdRemark())) {
                            logContent += "备注【" + dataBaseCollMatDetail.getCmtdRemark() + "】➨【" + collMatDetail.getCmtdRemark() + "】,";
                        }
                        if (logContent.length() > 0) {
                            logContent = logContent.substring(0, logContent.length() - 1);
                            logContent = "修改了流水号为【" + verifySheet.getOrderNo() + "】的申请单,修改内容如下" + logContent;
                            logService.saveLog("车间自用原材料领料申请单-保存", logContent);
                        }
                        mapper.updateCollMatDetailByParmaryKey(collMatDetail);
                    }
                }
                for (Integer cmtdId : delCmtdIdList) {
                    CollMatDetail collMatDetail = mapper.getCollMatDetailByPrimaryKey(cmtdId);
                    logService.saveLog("车间自用原材料领料申请单-保存", "删除了流水号为【" + verifySheet.getOrderNo() + "】的申请单,内容为物料用途【" + collMatDetail.getCmtdUse() + "】,物料名称【" + collMatDetail.getCmtdMatName() + "】,材质【" + collMatDetail.getCmtdTexture() + "】，规格【" + collMatDetail.getCmtdSpec() + "】,数量【" + collMatDetail.getCmtdNum() + "】，备注【" + collMatDetail.getCmtdRemark() + "】。");
                    mapper.deleteCollMatDetailByPrimarkKey(cmtdId);
                }
            }


            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("保存成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("保存车间自用原材料领料申请单异常" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("保存失败！");
        }
        return jsonResult;
    }

    /**
     * @methodName: getMaterialRequisition
     * @description: 获取领料单流水号
     * @param:
     * @return： java.lang.String
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/12 17:56
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    private String getMaterialRequisition() {
        String existOrderNo = mapper.getMaterialRequisition();
        //获取当前年月日
        Date currentDate = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        String currentDateStr = format.format(currentDate);
        if (existOrderNo != null) {
            //前缀
            String prefix = "LL";
            //获取中间部分的日期信息
            existOrderNo = existOrderNo.replace(prefix, "");
            String dataCode = existOrderNo.substring(1, existOrderNo.lastIndexOf("-"));
            if (!dataCode.equals(currentDateStr)) {
                return "LL-" + currentDateStr + "-00001";
            } else {
                String noCode = existOrderNo.substring(1).replace(dataCode, "").substring(1);
                Integer newNoCode = Integer.valueOf(noCode) + 1;
                DecimalFormat df = new DecimalFormat("00000");
                return "LL-" + currentDateStr + "-" + df.format(newNoCode);
            }
        } else {
            return "LL-" + currentDateStr + "-00001";
        }
    }

    /**
     * @methodName: submitList
     * @description: 根据条件查询领料申请提交页面查询列表
     * @param: param
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/12 18:40
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<VerifySheet> submitList(VerifySheet param) {
        param.setMakUid(ShiroUtils.getUserId());
        return mapper.findVerifySheetSubmitListByParam(param);
    }

    /**
     * @methodName: getVerifySheetByPrimaryKey
     * @description: 根据主键获取审核主单信息
     * @param: id
     * @return： com.zw.mes.module.materialRequisition.model.VerifySheet
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/12 19:05
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public VerifySheet getVerifySheetByPrimaryKey(Integer id) {
        return mapper.getVerifySheetByPrimaryKey(id);
    }

    /**
     * @methodName: findCollMatDetailByCmtdSheetId
     * @description: 根据主单主键获取明细列表
     * @param: id
     * @return： java.util.List<com.zw.mes.module.materialRequisition.model.CollMatDetail>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/12 19:08
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<CollMatDetail> findCollMatDetailByCmtdSheetId(Integer id) {
        return mapper.findCollMatDetailByCmtdSheetId(id);
    }

    /**
     * @methodName: delete
     * @description: 删除领料申请
     * @param: id
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/13 7:54
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult delete(Integer id) {
        JsonResult jsonResult = new JsonResult();
        try {
            VerifySheet sheet = mapper.getVerifySheetByPrimaryKey(id);
            if (sheet.getAppStatus() == 1 || sheet.getAppStatus() == 4) {
                sheet.setDelFlag(1);
                mapper.updateVerifySheetDelFlagByPrimaryKey(sheet);
                logService.saveLog("领料申请提交-删除领料申请", "删除流水号为【" + sheet.getOrderNo() + "】的领料申请！");
            } else if (sheet.getAppStatus() == 2) {
                jsonResult.setType(JsonResult.ResultType.ERROR);
                jsonResult.setMsg("尊敬的用户，该领料申请已提交，您不可删除！");
            } else if (sheet.getAppStatus() == 3) {
                jsonResult.setType(JsonResult.ResultType.ERROR);
                jsonResult.setMsg("尊敬的用户，该领料申请已审核通过，您不可删除！");
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("删除领料申请成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("删除领料申请异常！" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("删除领料申请失败！");
        }
        return jsonResult;
    }

    /**
     * @methodName: auditRemove
     * @description: 审核者删除领料申请
     * @param: id
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/13 13:15
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult auditRemove(Integer id) {
        JsonResult jsonResult = new JsonResult();
        try {
            VerifySheet sheet = mapper.getVerifySheetByPrimaryKey(id);
            if (sheet.getAppStatus() == 1 || sheet.getAppStatus() == 4 || sheet.getAppStatus() == 2) {
                sheet.setDelFlag(1);
                mapper.updateVerifySheetDelFlagByPrimaryKey(sheet);
                logService.saveLog("领料申请审核-审核者删除领料申请", "删除流水号为【" + sheet.getOrderNo() + "】的领料申请！");
            } else if (sheet.getAppStatus() == 3) {
                jsonResult.setType(JsonResult.ResultType.ERROR);
                jsonResult.setMsg("尊敬的用户，该领料申请已审核通过，您不可删除！");
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("删除领料申请成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("删除领料申请异常！" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("删除领料申请失败！");
        }
        return jsonResult;
    }

    /**
     * @methodName: submit
     * @description: 领料申请提交
     * @param: idStr
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/13 8:09
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult submit(String idStr) {
        JsonResult jsonResult = new JsonResult();
        Date currentDate = new Date();
        User user = ShiroUtils.getUser();
        try {
            String[] idArr = idStr.split(",");
            List<Integer> idList = new ArrayList<>();
            for (int i = 0; i < idArr.length; i++) {
                idList.add(Integer.valueOf(idArr[i]));
            }
            for (int i = 0; i < idList.size(); i++) {
                VerifySheet sheet = mapper.getVerifySheetByPrimaryKey(idList.get(i));
                sheet.setAppStatus(2);
                sheet.setSubmitTime(currentDate);
                sheet.setRejectReasons(null);
                mapper.updateVerifySheetByPrimaryKey(sheet);
                VerifyProcess addVerifyProcess = new VerifyProcess();
                addVerifyProcess.setSheetId(sheet.getId());
                addVerifyProcess.setCode("LL001");
                addVerifyProcess.setAppStatus(1);

                //查找当前节点
                List<VerifyProcess> nowUserNodeInfo = mapper.findAppNodeInfoByUserIdToEst(user.getId());
                // 如果没有流程
                if (nowUserNodeInfo == null || nowUserNodeInfo.size() == 0) {
                    // 无数据；1·没有再审批节点中，是员工级别的，那么直接就按照流程顺序走。
                    List<VerifyInfoModel> appList = mapper.findAppNodeInfoToEst(0);
                    /** 上一个节点是0 */
                    addVerifyProcess.setComp(0);
                    if (appList != null && appList.size() == 1) {
                        addVerifyProcess.setNowNode(appList.get(0).getId());
                        addVerifyProcess.setOrderNo(appList.get(0).getOrderNo());
                        addVerifyProcess.setStart(0);
                        /** 根据我当前登录的账号，和流程配置的级别，找到那个人、 */
                        int pid = mapper.getNowLevelByUserIdToEst(user.getId());
                        /** 执行递归查询 */
                        addVerifyProcess.setVerifier(getPid(appList.get(0).getPost(), pid));
                    } else if (appList != null && appList.size() >= 2) {
                        addVerifyProcess.setNowNode(appList.get(0).getId());
                        addVerifyProcess.setOrderNo(appList.get(0).getOrderNo());
                        /** 根据我当前登录的账号，和流程配置的级别，找到那个人、 */
                        int pid = mapper.getNowLevelByUserIdToEst(user.getId());
                        /** 执行递归查询 */
                        addVerifyProcess.setVerifier(getPid(appList.get(0).getPost(), pid));
                        addVerifyProcess.setStart(appList.get(1).getId());
                    }
                }
                //如果有流程
                else {
                    // 有数据；2·在流程的中间，那么返回它的，顺序、是否为起点、是否为终点。
                    List<VerifyInfoModel> appList2 =
                            mapper.findAppNodeInfoToEst(nowUserNodeInfo.get(0).getOrderNo());
                    /** 上一步，一定是0 ，因为我是申请啊。 */
                    addVerifyProcess.setComp(0);
                    /** 下一步，是流程的下一步 */
                    addVerifyProcess.setStart(nowUserNodeInfo.get(0).getId());
                    addVerifyProcess.setNowNode(appList2.get(0).getId());
                    addVerifyProcess.setOrderNo(appList2.get(0).getOrderNo());
                    int pid = mapper.getNowLevelByUserIdToEst(user.getId());
                    /** 执行递归查询 */
                    addVerifyProcess.setVerifier(getPid(appList2.get(0).getPost(), pid));
                }
                mapper.insertVerifyProcess(addVerifyProcess);
                logService.saveLog("领料申请提交", "流水号号为：【" + sheet.getOrderNo() + "】的领料申请提交了");
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("提交成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("领料申请提交异常：" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("提交失败！");
        }
        return jsonResult;
    }

    /**
     * 递归：直到找到审批级别的上级人员id为止
     *
     * @param post
     * @param pid
     * @return
     */
    private int getPid(int post, int pid) {
        int userId = 0;
        OrgModel nextModel = mapper.findNextLevelUserByPId(pid);
        if (nextModel != null) {
            if (nextModel.getPost() == post) {
                userId = nextModel.getSubmitUser();
            } else {
                getPid(post, nextModel.getPid());
            }
        }
        return userId;
    }

    /**
     * @methodName: auditList
     * @description: 获取审核列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.materialRequisition.model.VerifySheet>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/13 13:23
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<VerifySheet> auditList(VerifySheet param) {
        param.setCurrentUserId(ShiroUtils.getUserId());
        return mapper.auditList(param);
    }

    /**
     * @methodName: queryList
     * @description: 领料申请查询列表
     * @param: param
     * @return： java.util.List<com.zw.mes.module.materialRequisition.model.VerifySheet>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/13 16:04
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<VerifySheet> queryList(VerifySheet param) {
        return mapper.queryList(param);
    }

    /**
     * @methodName: audit
     * @description: 审核
     * @param: param
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/13 14:03
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public JsonResult audit(VerifySheet param) {
        JsonResult jsonResult = new JsonResult();
        Date currentTime = new Date();
        try {
            User user = ShiroUtils.getUser();
            //获取主单
            VerifySheet verifySheet = mapper.getVerifySheetByPrimaryKey(param.getId());
            VerifyProcess condition = new VerifyProcess();
            condition.setSheetId(verifySheet.getId());
            condition.setCode("LL001");
            //获取最后的流程
            VerifyProcess lastVerifyProcess = mapper.getLastVerifyProcessBySheetIdAndCode(condition);
            lastVerifyProcess.setAppTime(currentTime);
            if ("pass".equals(param.getType())) {
                lastVerifyProcess.setAppStatus(2);
            } else if ("reject".equals(param.getType())) {
                lastVerifyProcess.setAppStatus(0);
                verifySheet.setRejectReasons(param.getRejectReasons());
            }
            //更新最后流程的状态和审核时间
            mapper.updateVerifyProcessAppStatusAndAppTimeByPrimaryKey(lastVerifyProcess);
            //获取当前节点
            List<VerifyInfoModel> nowUserNodeInfo = mapper.findAppNodeInfoByUserId(user.getId());
            //通过
            if ("pass".equals(param.getType())) {
                //根据当前节点获取审核级别
                String auditLevel = mapper.getAuditLevelByNowNode(lastVerifyProcess.getNowNode());
                User revUser = mapper.getUserByPrimaryKey(lastVerifyProcess.getVerifier());
                if ("部长级/厂长级".equals(auditLevel)) {
                    verifySheet.setRevName(revUser.getName());
                    verifySheet.setRevTime(currentTime);
                    verifySheet.setRevSignUrl(revUser.getSign());
                } else if ("副总级".equals(auditLevel)) {
                    verifySheet.setAppName(revUser.getName());
                    verifySheet.setAppTime(currentTime);
                    verifySheet.setAppSignUrl(revUser.getSign());
                }

                if (lastVerifyProcess.getStart() == 0) {
                    //1.1·当前是否是最后一个节点
                    //1.1.1·修改业务主表的状态值
                    verifySheet.setAppStatus(3);
                    mapper.updateVerifySheetByPrimaryKey(verifySheet);
                } else {
                    //1.2·找到下一个节点、下下个节点、审批人
                    List<VerifyInfoModel> appList = mapper.findAppNodeInfo(nowUserNodeInfo.get(0).getOrderNo());
                    /**
                     * 根据我当前登录的账号，和流程配置的级别，找到那个人、
                     */
                    VerifyProcess addAppInfo = new VerifyProcess();

                    int pid = mapper.getNowLevelByUserId(user.getId());
                    /**
                     * 执行递归查询
                     */
                    addAppInfo.setVerifier(getPid(appList.get(0).getPost(), pid));
                    addAppInfo.setNowNode(appList.get(0).getId());
                    addAppInfo.setOrderNo(appList.get(0).getOrderNo());

                    if (appList != null && appList.size() >= 2) {
                        addAppInfo.setStart(appList.get(1).getId());
                    } else {
                        addAppInfo.setStart(0);
                    }
                    //下一个节点的，上一个节点是现在的id
                    addAppInfo.setComp(lastVerifyProcess.getNowNode());
                    addAppInfo.setCode("LL001");
                    addAppInfo.setSheetId(lastVerifyProcess.getSheetId());
                    addAppInfo.setAppStatus(1);
                    mapper.insertVerifyProcess(addAppInfo);
                    mapper.updateVerifySheetByPrimaryKey(verifySheet);
                }
                logService.saveLog("领料申请审核", ShiroUtils.getUser().getName() + "审核通过了流水号为【" + verifySheet.getOrderNo() + "】的领料申请单！");
            }
            //驳回
            else if ("reject".equals(param.getType())) {
                //2·NG+意见
                //2.1·存储当前的状态+结果
                if (lastVerifyProcess.getComp() == 0) {
                    //2.2.1·如果上一个是提交的话，修改业务主表的状态值
                    verifySheet.setAppStatus(4);
                    mapper.updateVerifySheetByPrimaryKey(verifySheet);
                } else {
                    //2.2·找到上一个节点，生成下一个节点、审批人//
                    /**
                     * 根据我当前审批记录，找到我上一个临近的审批记录
                     */
                    VerifyProcess addAppInfo = mapper.findNextUserByNgInfo(param.getId());
                    addAppInfo.setAppStatus(0);
                    mapper.insertVerifyProcess(addAppInfo);
                }
                logService.saveLog("领料申请审核", ShiroUtils.getUser().getName() + "驳回了流水号为【" + verifySheet.getOrderNo() + "】的领料申请单！");
            }
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
            jsonResult.setMsg("审核成功！");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("审核异常：" + e.getMessage());
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("审核失败！");
        }
        return jsonResult;
    }

    /**
     * @methodName: findSysDept
     * @description: 获取非删除的部门列表
     * @param:
     * @return： java.util.List<com.zw.mes.module.prodtaskmanager.model.SysDeptModel>
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣，盖世奇
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/15 8:14
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public List<SysDeptModel> findSysDept() {
        return mapper.findSysDept();
    }

    /**
     * @methodName: checkWhetherTheApprovalConfigurationOfMaterialRequisitionIsCompletelyCorrect
     * @description: 检测领料申请的审核流程定义是否完美配置
     * @param:
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/26 13:16
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public JsonResult checkWhetherTheApprovalConfigurationOfMaterialRequisitionIsCompletelyCorrect() {
        JsonResult jsonResult = new JsonResult();
        //获取当前用户的信息，判断当前用户的审核流程定义是否配置完美
        User user = mapper.getUserByPrimaryKey(ShiroUtils.getUserId());
        if (user.getOrgId() != null && user.getStatus() != 0) {
            //获取审核架构
            OrgModel orgModel = mapper.getOrgModelByPrimaryKey(user.getOrgId());
            if (orgModel != null && orgModel.getStatus() != 0) {
                //获取上级审核架构
                OrgModel parentOrg = mapper.getOrgModelByPrimaryKey(orgModel.getPid());
                if (parentOrg != null && parentOrg.getStatus() != 0) {
                    //判断第一级审核是否有审核流程
                    VerifyInfoModel verifyInfoCondition = new VerifyInfoModel();
                    verifyInfoCondition.setCode("LL001");
                    verifyInfoCondition.setPost(parentOrg.getPost());
                    verifyInfoCondition.setStartNode(1);
                    verifyInfoCondition.setComp(0);
                    verifyInfoCondition.setFlowType(1);
                    verifyInfoCondition.setIsDelete(0);
                    verifyInfoCondition.setOrderNo(1);
                    VerifyInfoModel firstVerifyInfo = mapper.getVerifyInfoModelByCondition(verifyInfoCondition);
                    if (firstVerifyInfo != null) {
                        //判断该审核架构是否有用户
                        User userCondition = new User();
                        userCondition.setOrgId(parentOrg.getId());
                        List<User> users = mapper.findUserByOrgIdAndStatusNotZero(parentOrg.getId());
                        if (users.size() > 0) {
                            for (int i = 0; i < users.size(); i++) {
                                if (getEndOrg(users.get(i)) == false) {
                                    jsonResult.setType(JsonResult.ResultType.ERROR);
                                    jsonResult.setMsg("审核流程配置错误，无法提交。");
                                } else {
                                    jsonResult.setType(JsonResult.ResultType.SUCCESS);
                                    jsonResult.setMsg("审核流程配置错误，无法提交。");
                                }
                            }
                        } else {
                            jsonResult.setType(JsonResult.ResultType.ERROR);
                            jsonResult.setMsg("审核流程配置错误，无法提交。");
                        }
                    } else {
                        VerifyInfoModel verifyInfoCondition1 = new VerifyInfoModel();
                        verifyInfoCondition1.setCode("LL001");
                        verifyInfoCondition1.setPost(parentOrg.getPost());
                        verifyInfoCondition1.setStartNode(0);
                        verifyInfoCondition1.setComp(1);
                        verifyInfoCondition1.setFlowType(1);
                        verifyInfoCondition1.setIsDelete(0);
                        verifyInfoCondition1.setOrderNo(1);
                        VerifyInfoModel firstVerifyInfo1 = mapper.getVerifyInfoModelByCondition(verifyInfoCondition1);
                        if (firstVerifyInfo1 != null) {
                            //判断该审核架构是否有用户
                            User userCondition = new User();
                            userCondition.setOrgId(parentOrg.getId());
                            List<User> users = mapper.findUserByOrgIdAndStatusNotZero(parentOrg.getId());
                            if (users.size() > 0) {
                                jsonResult.setType(JsonResult.ResultType.SUCCESS);
                            } else {
                                jsonResult.setType(JsonResult.ResultType.ERROR);
                                jsonResult.setMsg("审核流程配置错误，无法提交。");
                            }
                        } else {
                            jsonResult.setType(JsonResult.ResultType.ERROR);
                            jsonResult.setMsg("审核流程配置错误，无法提交。");
                        }
                    }
                } else {
                    jsonResult.setType(JsonResult.ResultType.ERROR);
                    jsonResult.setMsg("审核流程配置错误，无法提交。");
                }
            } else {
                jsonResult.setType(JsonResult.ResultType.ERROR);
                jsonResult.setMsg("审核流程配置错误，无法提交。");
            }
        } else {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("审核流程配置错误，无法提交。");
        }
        return jsonResult;
    }
    //递归检测
    private Boolean getEndOrg(User user) {
        if (user.getOrgId() != null && user.getStatus() != 0) {
            //获取审核架构
            OrgModel orgModel = mapper.getOrgModelByPrimaryKey(user.getOrgId());
            //如果是顶级审核者不需要验证
            if(orgModel.getPid()==0){
                return true;
            }else{
                if (orgModel != null && orgModel.getStatus() != 0) {
                    //获取上级审核架构
                    OrgModel parentOrg = mapper.getOrgModelByPrimaryKey(orgModel.getPid());
                    if (parentOrg != null && parentOrg.getStatus() != 0) {
                        //判断第一级审核是否有审核流程
                        VerifyInfoModel verifyInfoCondition = new VerifyInfoModel();
                        verifyInfoCondition.setCode("LL001");
                        verifyInfoCondition.setPost(parentOrg.getPost());
                        verifyInfoCondition.setStartNode(0);
                        verifyInfoCondition.setComp(0);
                        verifyInfoCondition.setFlowType(1);
                        verifyInfoCondition.setIsDelete(0);
                        verifyInfoCondition.setOrderNo(1);
                        VerifyInfoModel firstVerifyInfo = mapper.getVerifyInfoModelByCondition(verifyInfoCondition);
                        if (firstVerifyInfo != null) {
                            //判断该审核架构是否有用户
                            User userCondition = new User();
                            userCondition.setOrgId(parentOrg.getId());
                            List<User> users = mapper.findUserByOrgIdAndStatusNotZero(parentOrg.getId());
                            if (users.size() > 0) {
                                for (int i = 0; i < users.size(); i++) {
                                    return getEndOrg(users.get(i));
                                }
                            } else {
                                return false;
                            }
                        } else {
                            VerifyInfoModel verifyInfoCondition1 = new VerifyInfoModel();
                            verifyInfoCondition1.setCode("LL001");
                            verifyInfoCondition1.setPost(parentOrg.getPost());
                            verifyInfoCondition1.setStartNode(0);
                            verifyInfoCondition1.setComp(1);
                            verifyInfoCondition1.setFlowType(1);
                            verifyInfoCondition1.setIsDelete(0);
                            verifyInfoCondition1.setOrderNo(1);
                            VerifyInfoModel firstVerifyInfo1 = mapper.getVerifyInfoModelByCondition(verifyInfoCondition1);
                            if (firstVerifyInfo1 != null) {
                                //判断该审核架构是否有用户
                                User userCondition = new User();
                                userCondition.setOrgId(parentOrg.getId());
                                List<User> users = mapper.findUserByOrgIdAndStatusNotZero(parentOrg.getId());
                                if (users.size() > 0) {
                                    return true;
                                } else {
                                    return false;
                                }
                            } else {
                                return false;
                            }
                        }
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            }
        } else {
            return false;
        }
        return false;
    }
    /**
     * @methodName: checkWhetherTheApprovalConfigurationOfMaterialRequisitionIsCompletelyCorrect
     * @description: 检测领料申请的审核流程定义是否完美配置用于审核
     * @param:
     * @return： com.zw.mes.common.JsonResult
     * @exception：
     * @author： 徐一贺 tel:18341916590
     * @designer： 陈欣
     * @leader： 陈欣 tel:18104194240
     * @date： 2021/4/26 13:15
     * @office: 智能控制设计科
     * @research institute： 智能控制设计所
     * @department： 机械设计院
     * @company: 辽宁忠旺机械设备制造有限公司
     * @group： 忠旺集团
     * @version: 1.0
     */
    public JsonResult checkWhetherTheApprovalConfigurationOfMaterialRequisitionIsCompletelyCorrectByUnderReview() {
        JsonResult jsonResult = new JsonResult();
        User user = mapper.getUserByPrimaryKey(ShiroUtils.getUserId());
        if(getEndOrg(user)==true){
            jsonResult.setType(JsonResult.ResultType.SUCCESS);
        }else {
            jsonResult.setType(JsonResult.ResultType.ERROR);
            jsonResult.setMsg("审核流程配置错误，无法提交。");
        }
        return jsonResult;
    }
}
